//
//  MoviTiendas.m
//  ProyectoMoviTiendas
//
//  Created by Daniel Paez on 3/6/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#import "MoviTiendas.h"
#import "CategoriaProducto.h"
#import "SubcategoriaProducto.h"
#import "Producto.h"
#import "CategoriaTienda.h"
#import "SubcategoriaTienda.h"
#import "Item.h"
#import "Tienda.h"
#import "Persistencia.h"
#import "Comunicacion.h"


@implementation MoviTiendas


@synthesize cliente,barrios, productos;


#pragma mark - Instancia singleton de la clase

static MoviTiendas * instancia = nil;


#pragma mark - Instancia singleton de la clase


- (id)init
{
    self = [super init];
    if (self) 
    {
 

        
    }
    return self;
}

#pragma mark - Metodos

+ (void) initConInstancia: (MoviTiendas *) movi
{
    instancia = movi;  
  //  instancia.tiendas = [Persistencia cargarTiendas];
  //  instancia.categorias = [Persistencia cargarCategoriasProducto];

}

+(MoviTiendas *)darInstancia
{
    
    if (instancia == nil) {
        NSLog(@"hola");
        instancia = [[MoviTiendas alloc] init];

        instancia.barrios = [Comunicacion cargarBarrios];//[Persistencia cargarBarrios];
        if(instancia.barrios == nil)
        {
            //instancia.barrios = [Persistencia cargarBarrios];
        }
      //  instancia.productos = [Persistencia cargarProductos];
        
        //Cliente de prueba
     //   instancia.cliente = [instancia.persistencia cargarCliente];
    }
    return instancia;
}


- (BOOL) crearClienteConNombre: (NSString *) nombre
                  conDireccion: (NSString *) dir1
                     conBarrio: (NSString *) barrio
{
    Barrio *b = [self buscarBarrio:barrio];
    cliente = [[Cliente alloc] initConNombre:nombre conDireccion:dir1 conBarrio:b];
    if(cliente)
        return YES;
    else {
        return NO;
    }
}

- (BOOL) modificarClienteConNombre: (NSString *) nombre
                      conDireccion: (NSString *) dir1
                         conBarrio: (NSString *) barrio
{
    cliente.nombre=nombre;
    cliente.direccion1=dir1;
    cliente.barrio = barrio;
    
    if(cliente)
        return YES;
    else {
        return NO;
    }
}

- (NSMutableArray *) darTodoslosProductos
{

    return [NSMutableArray arrayWithArray:productos];    
}

- (NSMutableArray *) darProductosDeTiendas: (NSMutableArray *) nTiendas
{
       
   NSMutableArray *productos = [[NSMutableArray alloc] init]; 
  
    BOOL yaEsta = NO;
    for (Tienda *t in nTiendas)
    {
        for (CategoriaTienda *c in t.categorias) 
        {
            for (SubcategoriaTienda *s in c.subcategorias)
            {                   
                for (Item *item in s.items)
                {
                    yaEsta = NO;                                         
                    for (int i=0; i<[productos count] && !yaEsta; i++)
                    {
                        Producto *p2 = [productos objectAtIndex:i];
                        if([item.producto.nombre isEqualToString:p2.nombre])
                        {
                            yaEsta = YES;
                        }
                    }
                    
                    if(!yaEsta)
                    {
                        [productos addObject:item.producto];
                    }   
                }                
            }            
        }
    }
    return productos;    
}

- (NSMutableArray *) darItemsDeTienda: (Tienda *) nTienda
{    
    NSMutableArray *items = [[NSMutableArray alloc] init]; 
    
    for (CategoriaTienda *c in nTienda.categorias) 
    {
        for (SubcategoriaTienda *s in c.subcategorias)
        {                   
            for (Item *item in s.items)
            {
                [items addObject:item];                
            }                
        }            
    }  
        
    return items;    
}

- (NSMutableArray *) darItemsDeTiendas: (NSMutableArray *) nTiendas
{    
    NSMutableArray *items = [[NSMutableArray alloc] init]; 
    
    for (Tienda *t in nTiendas)
    {
        for (CategoriaTienda *c in t.categorias) 
        {
            for (SubcategoriaTienda *s in c.subcategorias)
            {                   
                for (Item *item in s.items)
                {
                    [items addObject:item];                
                }                
            }   
        }          
    }    
    
    return items;    
}


- (BOOL) existe: (Producto *) nProducto
         enTienda: (Tienda *) nTienda
{ 
    BOOL existe = NO;

    for (CategoriaTienda *c in nTienda.categorias) 
    {
        for (SubcategoriaTienda *s in c.subcategorias)
        {                   
            for (Item *item in s.items)
            {
                if([item.producto.nombre isEqualToString:nProducto.nombre])
                {
                    existe = YES;
                }             
            }                
        }       
    }
    return existe;  
}

- (Barrio *) buscarBarrio: (NSString *) nombreBarrio
{ 
    BOOL encontro = NO;
    
    Barrio *elBarrio;
    for (int i=0; i<barrios.count;i++) 
    {
        Barrio *b = [barrios objectAtIndex:i];
        if ([b.nombre isEqualToString:nombreBarrio])
        {
            encontro = YES;
            elBarrio = b;
        }           
    }
    return elBarrio;  
}


+(NSMutableArray *) darProductosConSoloItems: (NSMutableArray *) items
{
    NSMutableArray * productos = [[NSMutableArray alloc] init];
    Producto * prodNuevo;
    
    BOOL encontro = NO;
    for (Item * item in items) 
    {
        
        Producto * prodItem = item.producto;
        for (int i = 0; i < productos.count && !encontro; i++)
        {
            prodNuevo = [productos objectAtIndex:i];
            if([prodNuevo.nombre isEqualToString:prodItem.nombre])
            {
                encontro = YES;
                [prodNuevo.items addObject:item];
            }
        }
        if(!encontro)
        {
            prodNuevo = [[Producto alloc] init];
            prodNuevo.nombre = prodItem.nombre;
            prodNuevo.imagen = prodItem.imagen;
            [prodNuevo.items addObject:item]; 
            [productos addObject:prodNuevo];
        }
        
        encontro = NO;
        
    }
    
    return productos; 
}

- (void) encodeWithCoder:(NSCoder*) coder
{
    [coder encodeObject:[self cliente] forKey:@"cliente"];
    [coder encodeObject:[self barrios] forKey:@"barrios"];
    [coder encodeObject:[self productos] forKey:@"productos"];
//    [coder encodeFloat:[self strokeWidth] forKey:@"stroke_width"];
}


- (id) initWithCoder:(NSCoder*) coder
{
    //[self init];
        self = [super init];
    [self setCliente:[coder decodeObjectForKey:@"cliente"]];
    [self setBarrios:[coder decodeObjectForKey:@"barrios"]];
    [self setProductos:[coder decodeObjectForKey:@"productos"]];
    //[self setStrokeWidth:[coder decodeFloatForKey:@"stroke_width"]];
    
    return self;
}
@end
